﻿#pragma once

//方向枚举
enum { LEFT, RIGHT, TOP, BOTTOM, LEFTTOP, RIGHTTOP, LEFTBOTTOM, RIGHTBOTTOM };

// 实现一个可换背景的无框对话框，系统中可换肤的界面可以从这个类继续
// 所有窗口中的子控件，需要设置 setMouseTracking(true) ，否则鼠标事件不全，可能导致鼠标形状错误
class SkinedDialog : public QDialog {
    Q_OBJECT

public:
    explicit SkinedDialog(bool resizable = false, QWidget* parent = 0);
    ~SkinedDialog();

    void setBackgroundPic(QString pic_name);

signals:
    // 当最大化/恢复时，需要向外发射信号，通知其它部件更新状态
    void maximized();
    void normaled();

protected:
    virtual void paintEvent(QPaintEvent* event);
    virtual void mousePressEvent(QMouseEvent* event);
    virtual void mouseReleaseEvent(QMouseEvent* event);
    virtual void mouseMoveEvent(QMouseEvent* event);
    virtual void mouseDoubleClickEvent(QMouseEvent* event);
    virtual void reject();
    virtual void showEvent(QShowEvent* event);

    // 获取标题高度，主要用在最大化、最小化
    virtual int getTitleHeight();

private slots:
    // 切换最大化状态（最大化 <-> 正常）
    void changeMaxStatus();

private:
    int  getSideType(QPoint point);
    bool setCursorShape(int flag);
    void changeRectSize(int flag, QPoint globalPos);

private:
    QPoint m_move_point;    // 移动的距离
    bool   m_is_moving;     // 正在移动窗口
    bool   m_is_resizing;   // 正在改变窗口大小
    bool   m_cur_changed;   // 鼠标形状已改变为非箭头状态（箭头是常规状态）
    int    m_cur_shape;     // 鼠标形状

    bool    m_resizable;    // 大小是否可变
    QString m_background;   // 背景图片文件名
};